/**
 * Created by L.jp
 * Description:编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址
 *
 * IPv4 地址由十进制数和点来表示，每个地址包含4个十进制数，其范围为 0 - 255， 用(".")分割。比如，172.16.254.1；
 * 同时，IPv4 地址内的数不会以 0 开头。比如，地址 172.16.254.01 是不合法的。
 *
 * IPv6 地址由8组16进制的数字来表示，每组表示 16 比特。这些组数字通过 (":")分割。比如,  2001:0db8:85a3:0000:0000:8a2e:0370:7334 是一个有效的地址。
 * 而且，我们可以加入一些以 0 开头的数字，字母可以使用大写，也可以是小写。所以， 2001:db8:85a3:0:0:8A2E:0370:7334 也是一个有效的 IPv6 address地址
 * (即，忽略 0 开头，忽略大小写)。
 *
 * 然而，我们不能因为某个组的值为 0，而使用一个空的组，以至于出现 (::) 的情况。 比如， 2001:0db8:85a3::8A2E:0370:7334 是无效的 IPv6 地址。
 * 同时，在 IPv6 地址中，多余的 0 也是不被允许的。比如， 02001:0db8:85a3:0000:0000:8a2e:0370:7334 是无效的。
 *
 * 说明: 你可以认为给定的字符串里没有空格或者其他特殊字符。
 * User: 86189
 * Date: 2022-09-13
 * Time: 23:44
 */
public class Solution {
        boolean isIPv4 (String IP) {
            if (IP.indexOf('.') == -1) {
                return false;
            }
            String[] s = IP.split("\\.");
            if (s.length != 4) //IPv4必定为4组
                return false;
            for (String value : s) {
                if (value.length() == 0) //不可缺省，有⼀个分割为零，说明两个点 相连
                    return false;
                //⽐较数字位数及不为零时不能有前缀零
                if (value.length() > 3 || value.charAt(0) == '0' && value.length() != 1)
                    return false;
                int num = 0;
                for (int j = 0; j < value.length(); j++) { //遍历每个分割字符串，必须为数字
                    char c = value.charAt(j);
                    if (c < '0' || c > '9') return false;
                    num = num * 10 + (c - '0'); //转化为数字⽐较，0-255之间
                    if (num > 255) return false;
                }
            }
            return true;
        }
        boolean isIPv6 (String IP) {
            if (IP.indexOf(':') == -1) {
                return false;
            }
            String[] s = IP.split(":",-1);
            if (s.length != 8){ //IPv6必定为8组
                return false;
            }
            for (String value : s) {
                if (value.length() == 0 || value.length() > 4) { //每个分割不能缺省，不能超过4位
                    return false;
                }
                for (int j = 0; j < value.length(); j++) {
                    //不能出现a-fA-F以外的⼤⼩写字符
                    char c = value.charAt(j);
                    boolean expr = (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F');
                    if (!expr) {
                        return false;
                    }
                }
            }
            return true;
        }
        String solve(String IP) {
            if(isIPv4(IP))
                return "IPv4";
            else if(isIPv6(IP))
                return "IPv6";
            return "Neither";
        }
    }
    
